package com.lsec.springbootinit.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lsec.springbootinit.model.common.PageParam;
import com.lsec.springbootinit.model.common.PageResult;
import com.lsec.springbootinit.model.common.SortingField;
import org.springframework.util.CollectionUtils;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Page工具类
 *
 * @author Cherry
 * @date 2023/06/02
 */
public class PageUtils {

    /**
     * 构建Page
     *
     * @param pageParam 页面参数
     * @return {@link Page}<{@link T}>
     */
    public static <T> Page<T> buildPage(PageParam pageParam) {
        return buildPage(pageParam, null);
    }

    public static <T> Page<T> buildPage(PageParam pageParam, Collection<SortingField> sortingFields) {
        // 页码 + 数量
        Page<T> page = new Page<>(pageParam.getPage(), pageParam.getPageSize());
        // 排序字段
        if (!CollectionUtils.isEmpty(sortingFields)) {
            page.addOrder(sortingFields.stream().map(sortingField -> SortingField.ORDER_ASC.equals(sortingField.getOrder()) ?
                            OrderItem.asc(sortingField.getField()) : OrderItem.desc(sortingField.getField()))
                    .collect(Collectors.toList()));
        }
        return page;
    }


    /**
     * 转换结果页(适用于xml以IPage结构返回)
     * 详情参考 <a href="https://www.baomidou.com/pages/97710a/#page">...</a>
     *
     * @param page 页面
     * @return {@link PageResult}<{@link T}>
     */
    public static <T> PageResult<T> convertToPageResult(IPage<T> page) {
        return new PageResult<>(page.getRecords(), page.getTotal(), (int)page.getCurrent(), (int)page.getSize());
    }


    /**
     * 转换结果页(适用于xml以List结构返回)
     *
     * @param list 列表
     * @param page 页面
     * @return {@link PageResult}<{@link T}>
     */
    public static <T, S> PageResult<T> convertToPageResult(List<T> list, IPage<S> page) {
        return new PageResult<>(list, page.getTotal(), (int)page.getCurrent(), (int)page.getSize());
    }


    /**
     * 设置当前页和每页显示的数量
     * @param pageParam 分页表单
     * @return 返回分页信息
     */
    private <T> PageResult<T> setCurrentAndSize(PageParam pageParam){
        PageResult<T> pageResult = new PageResult<>();
        pageResult.setPage(pageParam.getPage());
        pageResult.setPageSize(pageParam.getPageSize());
        return pageResult;
    }
    /**
     * 设置总记录数
     * @param total 总记录数
     */
    private <T> void setTotalAndPages(Long total, PageResult<T> pageResult) {
        pageResult.setTotal(total);
        pageResult.setPages(pageResult.getTotal() % pageResult.getPageSize() > 0 ? pageResult.getTotal() / pageResult.getPageSize() + 1 : pageResult.getTotal() / pageResult.getPageSize());
    }


}
